﻿using System;
using System.Collections.Generic;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using ActionTrackerEntities;
using ActionTrackerRules;
using ActionTrackerRules.Helpers;
using Microsoft.Reporting.WebForms;

namespace ActionTrackerUI.Controllers
{
    public class AccionController : Controller
    {
        //
        // GET: /Accion/

        public ActionResult Index()
        {
            if (ValidarUsuario() && ((Usuario)Session["UsuarioLogueado"]).IdProyectoSeleccionado.HasValue)
            {
                AccionRules oAccionRules = new AccionRules();
                List<Accion> oListAcciones = oAccionRules.GetByFiltro(null, null, ((Usuario)Session["UsuarioLogueado"]).IdProyectoSeleccionado, null);
                return View(oListAcciones);
            }
            else
            {
                return RedirectToAction("Index", "Home");
            }
        }

        //
        // GET: /Accion/Create

        public ActionResult Create()
        {
            if (ValidarUsuario() && ((Usuario)Session["UsuarioLogueado"]).IdProyectoSeleccionado.HasValue)
            {
                UsuarioRules oUsuarioRules = new UsuarioRules();
                ViewBag.Usuarios = oUsuarioRules.GetByFiltro(null, ((Usuario)Session["UsuarioLogueado"]).IdProyectoSeleccionado, true);

                ReunionRules oReunionRules = new ReunionRules();
                ViewBag.Reuniones = oReunionRules.GetByFiltro(((Usuario)Session["UsuarioLogueado"]).IdProyectoSeleccionado);

                return View();
            }
            else
            {
                return RedirectToAction("Index", "Home");
            }
        }

        //
        // POST: /Accion/Create

        [HttpPost]
        public ActionResult Create(Accion model)
        {
            try
            {
                //busco el proyecto seleccionado en la web
                if (((Usuario)Session["UsuarioLogueado"]).IdProyectoSeleccionado.HasValue)
                {
                    model.IdProyecto = ((Usuario)Session["UsuarioLogueado"]).IdProyectoSeleccionado.Value;

                    if (!ValidarFechas(model.FechaInicio.Value, model.FechaVencimiento))
                    {
                        Session["MensajeError"] = "La fecha de Vencimiento debe ser mayor a la fecha de inicio";
                        return RedirectToAction("Create");
                    }
                    
                    
                    AccionRules oAccionRules = new AccionRules();

                    switch (oAccionRules.Guardar(model))
                    {
                        case ResponseEnum.Ok:
                            Session["MensajeExito"] = "La acción se registró correctamente";
                            return RedirectToAction("Index");
                        case ResponseEnum.Error:
                            Session["MensajeError"] = "Se produjo un error al intentar registrar la acción";
                            return RedirectToAction("Index");
                        case ResponseEnum.EntidadExistente:
                            Session["MensajeError"] = "Existe una acción con el mismo nombre '" + model.Descripcion.ToUpper() + "' para este proyecto";
                            return RedirectToAction("Create");
                        default:
                            Session["MensajeError"] = "Se produjo un error al intentar registrar la acción";
                            return RedirectToAction("Index");
                    }
                }
                else
                {
                    Session["MensajeError"] = "No se encontraron proyectos activos, se canceló el registro de la acción";
                }

                return RedirectToAction("Index");
            }
            catch
            {
                return View();
            }
        }

        //
        // GET: /Accion/Edit/5

        public ActionResult Edit(int id)
        {
            if (ValidarUsuario())
            {
                AccionRules oAccionRules = new AccionRules();
                Accion oAccion = oAccionRules.GetById(id);

                if (((Usuario)Session["UsuarioLogueado"]).IdUsuario == oAccion.Usuario.IdUsuario
                    || ((Usuario)Session["UsuarioLogueado"]).TipoUsuario == (int)TipoUsuarioEnum.Administrador)
                {
                    UsuarioRules oUsuarioRules = new UsuarioRules();
                    ViewBag.Usuarios = oUsuarioRules.GetByFiltro(null, ((Usuario)Session["UsuarioLogueado"]).IdProyectoSeleccionado, true);

                    ReunionRules oReunionRules = new ReunionRules();
                    ViewBag.Reuniones = oReunionRules.GetByFiltro(((Usuario)Session["UsuarioLogueado"]).IdProyectoSeleccionado);

                    ViewData["EstadosAccion"] = ViewData["EstadosAccion"] == null ? new SelectList(getEstados(), "Value", "Text") : ViewData["EstadosAccion"];

                    return View(oAccion);
                }
                else
                {
                    Session["MensajeError"] = "No puedes editar una acción que no te fue asignada";
                    return RedirectToAction("Index", "Accion");
                }
            }
            else
            {
                return RedirectToAction("Index", "Home");
            }
        }

        //
        // POST: /Accion/Edit/5

        [HttpPost]
        public ActionResult Edit(Accion model, int id)
        {
            try
            {
                model.IdAccion = id;
                AccionRules oAccionRules = new AccionRules();

                Accion oAccionGuardada = oAccionRules.GetById(id);
                if (!ValidarFechas(oAccionGuardada.FechaInicio.Value, model.FechaVencimiento))
                {
                    Session["MensajeError"] = "La fecha de Vencimiento debe ser mayor a la fecha de inicio";
                    return RedirectToAction("Edit", new { id = model.IdAccion });
                }

                
                switch (oAccionRules.Actualizar(model))
                {
                    case ResponseEnum.Ok:
                        Session["MensajeExito"] = "Se editó la acción #" + model.IdAccion + "!";
                        return RedirectToAction("Index");
                    case ResponseEnum.Error:
                        Session["MensajeError"] = "Se produjo un error al intentar editar la acción";
                        return RedirectToAction("Index");
                    case ResponseEnum.EntidadExistente:
                        Session["MensajeError"] = "Existe una acción con el mismo nombre '" + model.Descripcion.ToUpper() + "' para este proyecto";
                        return RedirectToAction("Edit", new { id = model.IdAccion });
                    default:
                        Session["MensajeError"] = "Se produjo un error al intentar editar la acción";
                        return RedirectToAction("Index");
                }
                
            }
            catch
            {
                return View();
            }
        }

        #region Metodos de soporte

        public List<SelectListItem> getEstados()
        {
            return new List<SelectListItem>
                       {
                           new SelectListItem
                               {
                                   Text = "Abierta",
                                   Value = "1"
                               },
                           new SelectListItem
                               {
                                   Text = "Cerrada",
                                   Value = "3",
                               }
                       };
        }

        //TODO: poner esto en un helper para todos los controladores
        public bool ValidarUsuario()
        {
            Usuario usuario = (Usuario)Session["UsuarioLogueado"];
            if (usuario == null)
            {
                return false;
            }
            else
            {
                return true;
            }
        }

        public List<SelectListItem> GetTiposMetricas()
        {
            return new List<SelectListItem>
                       {
                           new SelectListItem
                               {
                                   Text = "Por año",
                                   Value = "1"
                               },
                           new SelectListItem
                               {
                                   Text = "Por mes",
                                   Value = "2"
                               },
                           new SelectListItem
                               {
                                   Text = "Histórico",
                                   Value = "3",
                               }
                       };
        }

        public string GetMes(int? mes)
        {
            switch (mes)
            {
                case 1:
                    return "Enero";
                case 2:
                    return "Febrero";
                case 3:
                    return "Marzo";
                case 4:
                    return "Abril";
                case 5:
                    return "Mayo";
                case 6:
                    return "Junio";
                case 7:
                    return "Julio";
                case 8:
                    return "Agosto";
                case 9:
                    return "Septiembre";
                case 10:
                    return "Octubre";
                case 11:
                    return "Noviembre";
                case 12:
                    return "Diciembre";
            }
            return " ";
        }

        private bool ValidarFechas(DateTime pFechaInicio, DateTime pFechaVencimiento)
        {
            if (pFechaVencimiento >= pFechaInicio)
            {
                return true;
            }
            return false;
        }

        #endregion

        #region MetodosAjax

        public string BuscarAcciones()
        {
            try
            {
                AccionRules oAccionRules = new AccionRules();
                List<Accion> oListAcciones = oAccionRules.GetByFiltro(null, null, null, EstadoAccionEnum.Abierta);

                string oJsonArray = "{ \"aaData\":[";

                bool oBanPrimero = true;

                foreach (var oAccion in oListAcciones)
                {
                    string oModelString = "";
                    if (oBanPrimero)
                    {
                        oModelString = "[\"" +
                                      oAccion.IdAccion + "\",\"" +
                                      oAccion.Descripcion + "\",\"" +
                                      oAccion.Usuario.Nombre + "\",\"" +
                                      oAccion.Reunion.Descripcion + "\",\"" +
                                      oAccion.FechaInicio.Value.ToString("dd/MM/yyyy") + "\",\"" +
                                      oAccion.FechaVencimiento.ToString("dd/MM/yyyy") + "\",\"" +
                                      oAccion.FechaFin.Value.ToString("dd/MM/yyyy") + "\",\"" +
                                      oAccion.EstadoAccion.ToString() + "\"]";
                        oBanPrimero = false;
                    }
                    else
                    {
                        oModelString = ",[\"" +
                                      oAccion.IdAccion + "\",\"" +
                                      oAccion.Descripcion + "\",\"" +
                                      oAccion.Usuario.Nombre + "\",\"" +
                                      oAccion.Reunion.Descripcion + "\",\"" +
                                      oAccion.FechaInicio.Value.ToString("dd/MM/yyyy") + "\",\"" +
                                      oAccion.FechaVencimiento.ToString("dd/MM/yyyy") + "\",\"" +
                                      oAccion.FechaFin == null ? "-" : oAccion.FechaFin.Value.ToString("dd/MM/yyyy") + "\",\"" +
                                      oAccion.EstadoAccion.ToString() + "\"]";
                    }
                    oJsonArray += oModelString;
                }
                oJsonArray += "]}";

                return oJsonArray;
            }
            catch (Exception ex)
            {
                Response.Redirect("Error.cshtml");
                throw;
            }
        }



        #endregion

        #region Reportes

        #region ReportesAccionesVencidas


        public ActionResult Reporte()
        {
            if (ValidarUsuario())
            {
                return View();
            }
            else
            {
                return RedirectToAction("Index", "Home");
            }
        }
        [HttpPost]
        public ActionResult EmitirReporteAccionesVencidas()
        {
            const string nombreReporte = "ReporteAccionesVencidas";
            const string nombreDataSet = "DataSet1";

            var reglasAccion = new AccionRules();
            Session["ReporteAccionesVencidas"] = reglasAccion.GetByReporteAccionesVencidas(DateTime.Now, (int)((Usuario)Session["UsuarioLogueado"]).IdProyectoSeleccionado);
            // Session["Total"] = int.Parse(reglasAc.GetInscripcionesListado(pr.IdActividad, pr.FechaDesde, pr.FechaHasta).Count.ToString());
            if (ValidarUsuario())
            {
                Session["Parametros"] = new List<ReportParameter>
                    {
                        new ReportParameter("FechaHoraImpresion", DateTime.Now.ToString("dd/MM/yyyy , hh:mm")),
                        new ReportParameter("Fecha", DateTime.Now.ToString("dd/MM/yyyy")),
                        new ReportParameter("Usuario", ((Usuario)Session["UsuarioLogueado"]).Nombre),
                        new ReportParameter("Total", ((List<ReporteAccionesVencidas>)Session["ReporteAccionesVencidas"]).Count.ToString())
                    };

                return RedirectToAction("EmitirReporteAccionesVencidas", "Report", new { nombreReporte, nombreDataSet });
            }
            else
            {
                return RedirectToAction("Index", "Home");
            }

        }

        #endregion

        #region MetricasPromedio

        public ActionResult MetricaPromedio()
        {
            if (ValidarUsuario())
            {
                ViewData["TipoMetricaPromedio"] = ViewData["TipoMetricaPromedio"] == null ? new SelectList(GetTiposMetricas(), "Value", "Text") : ViewData["TipoMetricaPromedio"];
                var reglaAccion = new AccionRules();

                ViewData["Anios"] = reglaAccion.GetAniosOMeses(1);
                ViewData["Meses"] = reglaAccion.GetAniosOMeses(2);
                return View();
            }
            else
            {
                return RedirectToAction("Index", "Home");
            }
        }

        [HttpPost]
        public ActionResult EmitirMetricaPromedio(ParamMetricaPromedio parametros)
        {
            const string nombreReporte = "MetricaPromedio";
            const string nombreDataSet = "DataSet2";
            var reglasAccion = new AccionRules();
            var reglasProyecto = new ProyectoRules();
            switch (parametros.IdTipoMetrica)
            {
                case 1: //por anio
                    Session["MetricaPromedio"] = reglasAccion.GetMetricasPromedioPorUsuario(1, null, parametros.IdAnio, (int)((Usuario)Session["UsuarioLogueado"]).IdProyectoSeleccionado);
                    Session["Titulo"] = "Métrica promedio del año " + parametros.IdAnio;
                    break;
                case 2: //por mes
                    Session["MetricaPromedio"] = reglasAccion.GetMetricasPromedioPorUsuario(2, parametros.IdMes, null, (int)((Usuario)Session["UsuarioLogueado"]).IdProyectoSeleccionado);
                    Session["Titulo"] = "Métrica promedio del mes " + GetMes(parametros.IdMes);
                    break;
                case 3: //histórico
                    Session["MetricaPromedio"] = reglasAccion.GetMetricasPromedioPorUsuario(3, null, null, (int)((Usuario)Session["UsuarioLogueado"]).IdProyectoSeleccionado);
                    Session["Titulo"] = "Métrica promedio histórico";
                    break;
            }

            if (ValidarUsuario())
            {
                Session["Parametros"] = new List<ReportParameter>
                    {
                        new ReportParameter("FechaHoraImpresion", DateTime.Now.ToString("dd/MM/yyyy , hh:mm")),
                        new ReportParameter("Fecha", DateTime.Now.ToString("dd/MM/yyyy")),
                        new ReportParameter("Usuario", ((Usuario)Session["UsuarioLogueado"]).Nombre),
                        new ReportParameter("Proyecto", reglasProyecto.GetById((int)((Usuario)Session["UsuarioLogueado"]).IdProyectoSeleccionado).Objetivo),
                        new ReportParameter("TipoMetrica", Session["Titulo"].ToString())
                    };

                return RedirectToAction("EmitirMetricaPromedio", "Report", new { nombreReporte, nombreDataSet });
            }
            else
            {
                return RedirectToAction("Index", "Home");
            }

        }

        #endregion

        #region MetricaCantidad
        public ActionResult MetricaCantidad()
        {
            if (ValidarUsuario())
            {
                ViewData["TipoMetricaCantidad"] = ViewData["TipoMetricaCantidad"] == null ? new SelectList(GetTiposMetricas(), "Value", "Text") : ViewData["TipoMetricaCantidad"];
                var reglaAccion = new AccionRules();

                ViewData["Anios"] = reglaAccion.GetAniosOMeses(1);
                ViewData["Meses"] = reglaAccion.GetAniosOMeses(2);
                return View();
            }
            else
            {
                return RedirectToAction("Index", "Home");
            }
        }

        [HttpPost]
        public ActionResult EmitirMetricaCantidad(ParamMetricaCantidad parametros)
        {
            const string nombreReporte = "MetricaCantidad";
            const string nombreDataSet = "DataSet1";
            var reglasAccion = new AccionRules();
            var reglasProyecto = new ProyectoRules();
            switch (parametros.IdTipoMetrica)
            {
                case 1: //por anio
                    Session["MetricaCantidad"] = reglasAccion.GetMetricasCantidadPorUsuario(1, null, parametros.IdAnio, (int)((Usuario)Session["UsuarioLogueado"]).IdProyectoSeleccionado);
                    Session["Titulo"] = "Cantidad de acciones asignadas a cada usuario en el año " + parametros.IdAnio;
                    break;
                case 2: //por mes
                    Session["MetricaCantidad"] = reglasAccion.GetMetricasCantidadPorUsuario(2, parametros.IdMes, null, (int)((Usuario)Session["UsuarioLogueado"]).IdProyectoSeleccionado);
                    Session["Titulo"] = "Cantidad de acciones asignadas a cada usuario en el mes " + GetMes(parametros.IdMes);
                    break;
                case 3: //histórico
                    Session["MetricaCantidad"] = reglasAccion.GetMetricasCantidadPorUsuario(3, null, null, (int)((Usuario)Session["UsuarioLogueado"]).IdProyectoSeleccionado);
                    Session["Titulo"] = "Cantidad de acciones asignadas a cada usuario (Histórico)";
                    break;
            }

            if (ValidarUsuario())
            {
                Session["Parametros"] = new List<ReportParameter>
                    {
                        new ReportParameter("FechaHoraImpresion", DateTime.Now.ToString("dd/MM/yyyy , hh:mm")),
                        new ReportParameter("Fecha", DateTime.Now.ToString("dd/MM/yyyy")),
                        new ReportParameter("Usuario", ((Usuario)Session["UsuarioLogueado"]).Nombre),
                        new ReportParameter("Proyecto", reglasProyecto.GetById((int)((Usuario)Session["UsuarioLogueado"]).IdProyectoSeleccionado).Objetivo),
                        new ReportParameter("TipoMetrica", Session["Titulo"].ToString())
                    };

                return RedirectToAction("EmitirMetricaCantidad", "Report", new { nombreReporte, nombreDataSet });
            }
            else
            {
                return RedirectToAction("Index", "Home");
            }
        #endregion

        #endregion

        }
    }
}
        